/************************************
 * name: reader.h 
 * func: reader driver
 * date: 2015/06/03
 *
 ***********************************/
#ifndef __READER_H__
#define __READER_H__



#define __DEBUG_APP_O0__             0x00
#define __DEBUG_APP_O1__             0x01
#define __DEBUG_APP_O2__             0x02
#define __DEBUG_APP_O3__             0x03

#define SECRTOR_KEY_FACTOR_ASN		 0xB0  // 离散因子 (采用8位序列号)
#define SECRTOR_KEY_FACTOR_UID 		 0xB1  // 离散因子 (采用4+4)
#define READER_DEAL_OP_FLAG          0xB2  // 操作种类标志
#define READER_LOAD_OP_FLAG          0xB3  // 操作种类标志
#define APP_LITTLE_ENDIAN            0xB4  // 钱包小端模式
#define APP_BIG_ENDIAN               0xB5  // 钱包大端模式(默认 高字节在前)
#define DEAL_RESULT_MONEY_LESS       0xB6  // 余额不足
#define DEAL_RESULT_NORMAL           0xB7  // 正常结束交易
#define DEAL_RESULT_ABNORMAL         0xB8  // 不正常结束交易
#define READER_BUF_SIZ               512
#define READER_PIN            		 "000000"

#define FIND_CARD_FAIL               0
#define FIND_CARD_SUCC               1

// 返回值
#define RET_ERR                     -1
#define RET_OK                       0
#define RET_ERR_TYPE                -2
#define RET_ERR_WRITE               -3
#define RET_ERR_READ                -4


// 卡类型
#define READER_CONTACTLESS_M1        0x01 /* 选择非接M1 */
#define READER_SETTING               0x02 /* 读头设置 */
#define READER_CONTACTLESS_CPU       0x55 /* 选择非接CPU，这么定义是保持兼容老版驱动 */
#define READER_CONTACTLESS_24G		 0xFE /* 选择非触2.4G，这么定义是保持兼容老版驱动 */
#define READER_CONTACT_SAM1		     0xFF /* 选择接触SAM，这么定义是保持兼容老版驱动 */

// 读头操作命令
#define RC500_INIT                   0x10 /* 初始化RC500命令 */
#define RC500_ANTENNA_CONTROL        0x36 /* 天线控制命令 */
#define RC500_FIND_CARD              0x37 /* 寻卡命令 */
#define RC500_ANTI_COLLISION         0x38 /* 防冲突命令 */
#define RC500_SELECT_CARD            0x39 /* 选定/锁定一张卡片 */
#define RC500_HALT_CARD              0x29 /* 休眠卡片命令 */
#define RC500_AUTHENTICATION         0x4A /* mifare one 密钥认证 */
#define RC500_READ_CARD              0x4B /* 读mifare one块信息 */
#define RC500_WRITE_CARD             0x4C /* 写mifare one块信息 */
#define RC500_RST_CPU_CARD           0x54 /* 复位非接CPU卡 */
#define RC500_DESELECT_CPU_CARD      0x56 /* 退出激活CPU卡 */

typedef    char                      s8; 
typedef    const char               cs8;
typedef    unsigned char             u8;
typedef    const unsigned char      cu8;
typedef    short                    s16;
typedef    const short             cs16;
typedef    unsigned short           u16;
typedef    const unsigned short    cu16;
typedef    int                      s32;
typedef    const int               cs32;
typedef    unsigned int             u32;
typedef    const unsigned int      cu32;
typedef    long                     s64;
typedef    const long              cs64;
typedef    unsigned long            u64;
typedef    const unsigned long     cu64;



typedef struct {
	s8             *psam_path;           // psam 文件路径
}psam_apdu_input;


typedef struct {
	s8              deal_index[4];       // 终端交易流水号 (CPU卡交易过程产生 (M1卡 = 数据库索引号))
	s8              terminal[12];        // 终端号 现在使用6字节、其它保留
}psam_apdu_output;


typedef struct {
	s8             deal_cnt[2];          // 交易累计次数 (cpu卡、M1卡返回数据)
	s8             deal_tac[4];          // TAC (cpu卡自己产生，M1卡计算得出)
	s8             ed_val[4];            // 电子存折余额
	s8             ep_val[4];            // 电子钱包余额
}deal_apdu_output;

typedef struct {
	u8             endian;               // 交易钱包字节序 
	s8             key_data[16];         // 密钥数据
}mifare;

typedef struct {
	u8             factor_flag;          // 离散因子标识 
	s8             index[4];             // 数据库索引号
	u8             deal_ret;             // 交易结果
	u8             deal_type;            // 钱包类型 M1:0x01-主钱包, 0x02-补贴钱包 CPU: 01-电子钱包 02-电子存折
	s8             *name;                // 文件名
	s8             *path;                // 子目录
	s8             money_val[4];         // 卡片余额
	s8             deal_val[4];          // 交易定值 使用⑩⑥进制保存 0x64 = 1RMB 高字节在前 
	s8             deal_rebate[4];       // 交易折扣 
	s8             pin[3];               // 个人识别码
	s8             deal_time[8];         // 交易时间
	s8             card_id[12];          // 卡应用序列号
	s8             card_num[12];         // 卡物理号 由刷卡时获得  
	mifare         m1;                   // m1卡私有数据
          
}deal_apdu_input;

typedef  int (* cpu_deal_handle)(void *);

typedef  struct {
	u8               op_type;                               
	u8               type;                					// 卡类型 
	u8               status;              					// 寻卡状态    
	u8               run_flag;            					// 线程运行标志
	s32              fd;                  					//  设备号
	
	cpu_deal_handle  deal_op;            					// 消费操作
	cpu_deal_handle  load_op;                               // 圈存操作
	psam_apdu_input  psam_in_data;        					// psam 输入数据
	psam_apdu_output psam_out_data;       					// psam产生数据
	deal_apdu_input  deal_in_data;        					// 交易输入数据
	deal_apdu_output deal_out_data;					        // 交易产生数据
	s8               recv_data[READER_BUF_SIZ];             // 接收缓存
	s8               send_data[READER_BUF_SIZ];             // 发送缓存
}reader_op;




typedef  struct reader{
	union {
		u8 mf_comm; 
		u8 ins;	
	}cmd;	
	
	union {
		u8 mf_flag;
		u8 p1;	
	}pa1;
	
	union {
		u8 mf_sector;
		u8 p2;	
	}pa2;
	
	union {
		u8 mf_len;
		u8 lc;
	}len;	

	u8 cla;
	u8 le;	
	u8 sw1;	
	u8 sw2;	
	u8 type;
	s8 *data;
	
}reader_data;



//   中国电信翼机通宏定义
//==================================================================================
#define     CCTC_YJD_AID1                       "\xDF\x10"   // 应用目录
#define     CCTC_YJD_AID2                       "\xDF\x11"   // 保留
#define     CCTC_YJD_GET_LOAD_KEY_PSAM_DIR      "\xDF\x01"   // 进PSAM目录 获得圈存子密钥
#define     CCTC_YJD_GET_DEAL_KEY_PSAM_DIR      "\xDF\x10"   // 进PSAM目录 获取消费子密钥
#define     CTCC_YJD_KEY_NAME                   "ESTM1KEY"   // 密钥数据体
#define 	CTCC_YJD_KEY_FLAG                   0x27         // 密钥标识符 (消费 圈存)
#define     CTCC_YJD_KEY_FLAG_TAC               0x26         // 计算TAC密钥标识符

#define     CTCC_YJD_KEY_ID						0x01         // 密钥索引 (消费 TAC)
#define     CTCC_YJD_KEY_ID_LOAD                0x12         // 圈存密钥索引

// 扇区定义
#define     S0B0                                0
#define     S0B1                                1
#define     S0B2                                2
#define     S0B3                                3
#define     S1B0                                4      // 钱包块
#define     S1B1                                5      // 备份钱包块
#define     S1B2                                6
#define     S1B3                                7
#define     S2B0                                8
#define     S2B1                                9
#define     S2B2                                10
#define     S2B3                                11
#define     S3B0                                12
#define     S3B1                                13
#define     S3B2                                14
#define     S3B3                                15
#define     S4B0                                16
#define     S4B1                                17
#define     S4B2                                18
#define     S4B3                                19
#define     S5B0                                20     // 补贴钱包块
#define     S5B1                                21     // 备分补贴钱包块
#define     S5B2                                22
#define     S5B3                                23
#define     S6B0                                24
#define     S6B1                                25
#define     S6B2                                26
#define     S6B3                                27
#define     S7B0                                28
#define     S7B1                                29
#define     S7B2                                30
#define     S7B3                                31
#define     S8B0                                32     // 钱包交易明细
#define     S8B1                                33     // 备份钱包交易
#define     S8B2                                34
#define     S8B3                                35






//==================================================================================


extern int 	  DEBUG_APP_WALL; // 调试信息显示等级 00 01 02 默认01
extern reader_op* reader_attr_init(s8 *dev_name);
extern s32 reader_search_start(reader_op* data);
extern inline s32 reader_communication(cs32 fd, reader_data *send, reader_data *recv);
extern s32 reader_attr_destroy(reader_op *reader);
extern inline s32 reader_get_factor(reader_op *reader);


#endif

